#ifndef __CHARGER_H_
#define __CHARGER_H_



#include "NM1120.h"
#include "Base.h"
#include "battery.h"

#define VDD_volt            (3.3f)              /*vdd0电压 单位:V*/
#define ADC_MAX             (4095)
#define Current_gain_L      (13.5f)             /*左电池电流增益 1.0x*/
#define Current_gain_R      (20.0f)             /*右电池电流增益*/


/*温度PID*/
#define KP_Temp              _Q15(0.2)
#define KI_Temp              _Q15(0.01)
#define KD_Temp              _Q15(0.01)
#define OUT_max_Temp         (1)                  
#define OUT_min_Temp         (-1)   


/* *********************************************************VOLTAGE电池电压********************************************************* */
#define BAT_VOLTAGE_Gain        (47.0f / (47.0f + 100.0f))                              /*电池电压增益 1.0x*/
#define BAT_Voltage_To_ADC(x)   ((x) * BAT_VOLTAGE_Gain / VDD_volt * ADC_MAX)           /*电池电压转换为ADC值 x:电压*/



/* *********************************************************CURRENT 电流********************************************************* */
#define Current_Sample_Res          (0.03f)                                                 /*电流采样电阻 单位:ohm*/
#define L_BAT_Current_To_ADC(x)     ((x) * Current_gain_L * Current_Sample_Res / VDD_volt * ADC_MAX)  /*电流转换为ADC值 x:A*/ 
#define R_BAT_Current_To_ADC(x)     ((x) * Current_gain_R * Current_Sample_Res / VDD_volt * ADC_MAX)  /*电流转换为ADC值 x:A*/ 

/* *********************************************************C+电压********************************************************* */
#define Charge_Vol_Gain         (47.0f / (47.0f + 100.0f))
#define Charge_Vol_To_ADC(x)    ((x) * Charge_Vol_Gain / VDD_volt * ADC_MAX)            /*C+电压转换为ADC值 x:V*/


/* *********************************************************TEMP********************************************************* */
#define Temp_Pull_Res           (10.0f)                                                 /*温度采样上拉电阻 单位:Kohm*/
#define Temp_Res_To_ADC(x)      ((x) / ((x) + Temp_Pull_Res) * ADC_MAX)                 /*温度转换为ADC值 x:Kohm*/

#define Temp_recovery_EN        (1)                                                     /*温度恢复使能*/

/*
*   65℃     2.58K
*   55℃     3.52K
*   45℃     4.9K
*   35℃     6.93K

*   0℃      27.6K
*   10℃     18.06K   
*/  
#define Over_Temp_ADC           Temp_Res_To_ADC(0.60)       /*过温保护值*/
#define Rec_Over_Temp_ADC       Temp_Res_To_ADC(1.67)       /*过温保护恢复值*/

#define Low_Temp_ADC            Temp_Res_To_ADC(27.6)      /*低温保护值*/
#define Rec_Low_Temp_ADC        Temp_Res_To_ADC(18.06)       /*低温保护恢复值*/

#define MAX_TEMP_ADC_VALUE      Temp_Res_To_ADC(1.45)       /*充电最大温度值 85℃*/
#define MIN_TEMP_ADC_VALUE      Temp_Res_To_ADC(1.67)       /*充电2A时低于此温度进行上调电流 70℃*/

#define Temp_Fault_time         (1000)                      /*温度保护时间阈值 单位:ms*/
#define Temp_Fault_Recov_time   (1000)                      /*温度保护恢复时间 单位:ms*/

/* *********************************************************Vout 充电电压********************************************************* */
#define Vout_Gain               (47.0f / (47.0f + 100.0f))                              /*Vout增益 1.0x*/
#define Vout_Voltage_To_ADC(x)  ((x) * Vout_Gain / VDD_volt * ADC_MAX)                  /*Vout转换为ADC x:V*/


typedef enum{
    CHARGE_INIT = 0,        /*充电初始化过程*/
    CHARGE_NOMOL ,          
    CHARGE_PULL_OUT
}chargeState_t;

typedef struct{
    chargeState_t state;    /*充电器状态*/

    Battery_t battery_L;    /*左电池*/
    Battery_t battery_R;    /*右电池*/

    Adc_t Vin;              /*输入电压采样 C+电压*/
    uint16_t vin_voltage;   /*输入电压*/

    Adc_t temp;             /*温度采样*/
    uint16_t ot_value;      /*过温保护值*/
    uint16_t lt_value;      /*低温保护值*/
    uint16_t ot_cnt;        /*过温保护计数*/
    uint16_t lt_cnt;        /*低温保护计数*/

    uint16_t ot_rec_value;  /*过温恢复值*/
    uint16_t lt_rec_value;  /*低温恢复值*/
    uint16_t ot_rec_cnt;    /*过温恢复计数*/
    uint16_t lt_rec_cnt;    /*低温恢复计数*/

    uint8_t error_LT;       /*低温故障标志*/
    uint8_t error_OT;       /*过温故障标志*/

    uint16_t open_sample_time;
    uint8_t vol_samp_flag;

    uint8_t flash_charger;  /*闪充标志*/
    uint16_t Epwm_max_duty;  /*EPWM最大占空比*/
    
    KFPTypeS kfp_C_posit;    /*C+电压卡尔曼*/

    pid_t temp_pid;         /*温度pid*/
    uint16_t temp_pwm_duty; /*温控后的pwm占空比*/
    uint16_t adj_max_value;/*最大温度值*/
    uint16_t adj_min_value;
    uint8_t reduce_current; /*减小电流flag*/
}charger_t ;



typedef enum{
    C_Vin_voltage = 0, 
    Vout_voltage,
    Battery_voltage,
    charge_Current
}actual_value_t;



uint32_t get_actual_value(uint16_t value , actual_value_t type , Battery_t * pBat);
void Temp_protect(charger_t * charge);

void Battery_process(Battery_t * pBat);
void Get_vin_voltage(charger_t * pCharger);
void flash_charger_detect(charger_t * pCharger);

void Pid_calculat_process(Battery_t* pBat);
void Battery_charge_en(Battery_t * pBat);

void Open_voltage_detect(void);

void Charger_state_machine(charger_t * pCharge);

extern charger_t charger;


#endif


